package com.lich.service;

import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lich.dao.UserProductMapper;
import com.lich.dao.UsersMapper;
import com.lich.entity.UserProduct;
import com.lich.entity.Users;

/**
 * @description 用户
 * @date 2016年9月7日
 * @author lich
 */
@Service
public class UsersService {

	@Resource
	UsersMapper usersMapper;

	@Resource
	UserProductMapper userProductMapper;

	/**
	 * @description 通过用户姓名查找
	 * @date 2016年8月29日
	 * @author lich-thinkpad
	 * @param username
	 * @return
	 */
	public Users getByUsername(String username) {
		return usersMapper.selectByUsername(username);
	}

	/**
	 * @description 添加用户
	 * @date 2016年8月30日
	 * @author lich-thinkpad
	 * @param user
	 * @return
	 */
	@Transactional(rollbackFor = Exception.class)
	public int add(Users user, Integer[] productIds) {
		String salt = user.getUsername() + "I'm hungry";
		int hashIterations = 3;
		String cryptedPwd = new Md5Hash(user.getPassword(), salt, hashIterations).toString();
		user.setPassword(cryptedPwd);
		int insertUser = usersMapper.insert(user);
		if (insertUser < 0) {
			return insertUser;
		} else if (productIds != null) {
			for (int productId : productIds) {
				UserProduct userProduct = new UserProduct();
				userProduct.setUserId(user.getId());
				userProduct.setProductId(productId);
				int insertUserProduct = userProductMapper.insert(userProduct);
				if (insertUserProduct < 0)
					return insertUserProduct;
			}
		}
		return 1;
	}

	/**
	 * @description 更新用户
	 * @date 2016年9月12日
	 * @author lich
	 * @param user
	 * @param productIds
	 * @return
	 */
	@Transactional(rollbackFor = Exception.class)
	public int update(Users user, Integer[] productIds) {
		if (StringUtils.isNotBlank(user.getPassword())) {
			String salt = user.getUsername() + "I'm hungry";
			int hashIterations = 3;
			String cryptedPwd = new Md5Hash(user.getPassword(), salt, hashIterations).toString();
			user.setPassword(cryptedPwd);
		} else {
			user.setPassword(null);
		}
		int updateUser = usersMapper.updateById(user);
		int deleteByUserId = userProductMapper.deleteByUserId(user.getId());
		if (updateUser < 0) {
			return updateUser;
		} else if (deleteByUserId < 0) {
			return deleteByUserId;
		} else if (productIds != null) {
			for (int productId : productIds) {
				UserProduct userProduct = new UserProduct();
				userProduct.setUserId(user.getId());
				userProduct.setProductId(productId);
				int insertUserProduct = userProductMapper.insert(userProduct);
				if (insertUserProduct < 0)
					return insertUserProduct;
			}
		}
		return 1;
	}

	/**
	 * @description 删除用户
	 * @date 2016年9月8日
	 * @author lich
	 * @param userId
	 * @return
	 */
	@Transactional(rollbackFor = Exception.class)
	public int deleteById(int userId) {
		int delUser = usersMapper.deleteById(userId);
		if (delUser < 0) {
			return delUser;
		} else {
			int delUserProduct = userProductMapper.deleteByUserId(userId);
			if (delUserProduct < 0)
				return delUserProduct;
		}
		return 1;
	}

	/**
	 * @description 获取一页用户数据
	 * @date 2016年9月8日
	 * @author lich
	 * @param page
	 * @return
	 */
	public PageInfo<Users> getPage(Integer pageNum) {
		PageHelper.startPage(pageNum, 10);
		List<Users> users = usersMapper.selectPage(pageNum);
		return new PageInfo<>(users);
	}
}
